﻿/********************************************************************************/
/* 	state.d																		*/
/*------------------------------------------------------------------------------*/
/*	製作		（　゜ワ゜）ノ　／　松久貫太									*/
/*	製作開始　	2007/05/11														*/
/*	MAIL		omega@personal.email.ne.jp										*/
/*	URL		http://nagoya.cool.ne.jp/o_mega										*/
/*																				*/
/*	このソースは「やらわかライセンス」の元で配布されています。					*/
/*-更新履歴---------------------------------------------------------------------*/
/*	2007/--/--																	*/
/*-その他-----------------------------------------------------------------------*/
/*	なし																		*/
/********************************************************************************/

/* ライブラリのインポート *******************************************************/
private import hell2;		// dHell2ライブラリ
private import screen;
private import vector;
private import keypad;
private import gamecore;

private import std.string;
private import std.math;
private import std.math2;
private import std.stream;

private import defines;

/* グローバル定数定義 ***********************************************************/
GameState g_gamestate = null;


/* load *************************************************************************/
/*	リソースの読み込み															*/
/*-引数-------------------------------------------------------------------------*/
/*	なし																		*/
/*-返り値-----------------------------------------------------------------------*/
/*	なし																		*/
/********************************************************************************/
void load()
{
	//Hell_loadTexture("font","resource/font/font.bmp" , [0,255,0]);
	Hell_loadTexture("mark","resource/image/mark.bmp" , [0,255,0]);
	
	Hell_write("resource loaded.\n");
}

/* GameState ********************************************************************/
/*	ゲーム全体の状態遷移を管理するクラス										*/
/********************************************************************************/
class GameState
{
private:
	int msg;				// リクエストメッセージ
public:
	enum
	{
		MSG_NONE,
		MSG_REQ_TITLE,			// タイトル状態へ　行きたい
		MSG_REQ_GAME,			// ゲーム
	}
	
	void move(){}
	void draw(){}
	
	// 設定
	void setMsg(int m)
	{
		msg = m;
	}
	// 取得
	int getMsg()
	{
		return msg;
	}
}



void loop()
{
	if(g_gamestate)
	{
		// メッセージ指示による状態遷移
		switch(g_gamestate.msg)
		{
			case GameState.MSG_NONE:
				break;
			case GameState.MSG_REQ_TITLE:
				g_gamestate = new TitleMain();
				break;
			case GameState.MSG_REQ_GAME:
				g_gamestate = new GameMain();
				break;
			default:
				Hell_write("Uknown msg at loop.");
		}
	}
	else
	{
		// 初期状態
		g_gamestate = new TitleMain();//new GameMain();
		Hell_write("Exec loop.\n");
	}
	
	static int frameskip = 0;
	static bool nextskip = false;
	static int wt = 0;
	
	g_gamestate.move();
	if(!nextskip) g_gamestate.draw();
	//	Hell_drawFont("WT:" ~ std.string.toString(wt) ,0 ,470,1);
	Hell_update();
	
	wt = Hell_wait(16);
	if(wt > 18 && frameskip < 2){ // 60fpsを維持しようとする 最大1/3作画(スキップ
		nextskip = true;
		frameskip++;
	}else{
		nextskip = false;
		frameskip = 0;
	}
}

/* GameMain *********************************************************************/
/*	ゲーム本体の状態															*/
/********************************************************************************/
class TitleMain : GameState
{
public:
	int timer;
	Keypad keypad;
	
	this()
	{
		timer = 0;
		keypad = new Keypad(0);
	}
	
	void move()
	{
		timer++;
		if(keypad.isPushEnter()) setMsg(GameState.MSG_REQ_GAME);
	}
	
	void draw()
	{
		Hell_begin();
		
		Hell_setAlpha(HELL_ALPHA_NORMAL);
		setPerspective();
		{
			glLoadIdentity();
			glTranslatef(0,0,-10);
			glScalef(10,10,10);
			glColor4f(1,1,1,1);
		}
		resetPerspective();
		
		Hell_drawFont("T E R U   /   O M E G A   2 0 0 7" , 190, 480-48 , 1 , 255,255,255);
		
		Hell_drawFont("O Z O N E X" , 150, 200-48 , 4 , 255,255,255);
		Hell_drawFont("-  r  e  c  u  r  s  i  o  n  -" , 200, 240-48 , 1 , 255,255,255);
		
		if(timer % 60 < 50)
		{
			Hell_drawFont("Press to start!",210 ,240 + 24 ,2 );
		}
	}
}

/* GameMain *********************************************************************/
/*	ゲーム本体の状態															*/
/********************************************************************************/
class GameMain : GameState
{
public:
	int timer;
	GameCore gamecore = null;
	
	this()
	{
		timer = 0;
		gamecore = new GameCore(GAMEMODE.NORMAL);
	}
	
	void move()
	{
		timer++;
		gamecore.move();
		if(gamecore.isOver()){
			setMsg(MSG_REQ_TITLE);
		}
	}
	
	void draw()
	{
		Hell_begin();
		/*
		resetPerspective();
		Hell_setAlpha(HELL_ALPHA_PRODUCT);
		Hell_drawRect(0,0,640,480, 0, 0, 128,160,240,255);
		*/
		//Hell_drawRect(0,0,640,480, 0, 0, 240,160,128,255);
		
		Hell_setAlpha(HELL_ALPHA_NORMAL);
		setPerspective();
		
		glTranslatef(0,0,CHAR_Z_SURFACE);
		glRotatef(15.0 * sin(timer / 350.0) , 5 + 15.0 * cos(timer / 170.0) , 2.0 * sin(timer / 110.0));
/*
		// ぐるぐる
		glTranslatef(0,0, -CHAR_Z_SURFACE / 2 - CHAR_Z_SURFACE / 4 * cos(timer / 110.0));
		glRotatef(0,0,-90);
		glRotatef(0 , 45 + 45.0 * cos(timer / 170.0) ,0);
		glRotatef(0,0, timer / 2.0);
*/		
		glTranslatef(0,0,-CHAR_Z_SURFACE);
		
		gamecore.draw();
		resetPerspective();
		
		Hell_drawFont("TIMER:" ~ std.string.toString(cast(double)(timer / 6) / 10) ,0 ,0,2);
		Hell_drawFPS();
		
	}
}
